// linkUtils.js - 链接跳转工具类
const tabBarPages = [
  "/pages/index/index",
  "/pages/course/index",
  "/pages/meeting/index",
  "/pages/mine/index"
];

/**
 * 智能链接跳转
 * @param {string} link - 需要处理的链接
 * @param {Object} [options] - 额外配置项
 * @param {string} [options.webViewPath='/pages/webview/webview'] - webview页面路径
 * @param {Function} [options.failCallback] - 失败回调函数
 */
function openLink(link, options = {}) {
  if (!link) {
    console.error('链接不能为空');
    return;
  }

  const config = {
    webViewPath: '/pages/webwiew/index',
    ...options
  };

  // 链接类型判断
  if (isLocalMiniprogramLink(link)) {
    openLocalPage(link, config.failCallback);
  } else if (isOtherMiniprogramLink(link)) {
    openOtherMiniprogram(link, config.failCallback);
  } else if (isWebLink(link)) {
    openWebView(link, config.webViewPath, config.failCallback);
  } else if (isLocalAppLink(link)) {
    openLocalApp(link, config.failCallback);
  } else {
    handleUnsupportedLink(link, config.failCallback);
  }
}

/**
 * 判断是否是小程序内部页面链接
 */
function isLocalMiniprogramLink(link) {
  return link.startsWith('/') || 
         link.startsWith('pages/') || 
         /^wx?:\/\/[^/]+\/pages\//.test(link);
}

/**
 * 判断是否是小程序间跳转链接
 */
function isOtherMiniprogramLink(link) {
  return link.startsWith('miniapp://') || 
         /^wx?:\/\/[^/]+\/jump-miniprogram\//.test(link) ||
         /^[0-9a-zA-Z_-]{15,}$/.test(link); // 小程序ID正则
}

/**
 * 判断是否是网页链接
 */
function isWebLink(link) {
  return /^(http|https):\/\//.test(link);
}

/**
 * 判断是否是本地应用链接
 */
function isLocalAppLink(link) {
  return /^(wps|qq|baiduyun|wxwork|dingtalk|alipay|taobao|weixin|wechat):\/\//i.test(link);
}

/**
 * 打开小程序内部页面
 */
function openLocalPage(path, failCallback) {
  // 清理多余的协议头和参数
  const cleanPath = path.replace(/^(wx:\/\/[^/]+\/)?(pages\/)?/, '');
  
  try {
    // 判断是否是tabBar页面
    const isTabBarPage = tabBarPages.some(item => cleanPath.includes(item));
    
    if (isTabBarPage) {
      wx.switchTab({
        url: `/${cleanPath}`,
        fail: (err) => handleFail(err, failCallback)
      });
    } else {
      wx.navigateTo({
        url: `/${cleanPath}`,
        fail: (err) => handleFail(err, failCallback)
      });
    }
  } catch (err) {
    handleFail(err, failCallback);
  }
}

/**
 * 打开其他小程序
 */
function openOtherMiniprogram(link, failCallback) {
  try {
    // 解析小程序ID和路径
    let appId = '';
    let path = '';
    
    if (link.startsWith('miniapp://')) {
      const parts = link.replace('miniapp://', '').split('/');
      appId = parts[0];
      path = '/' + parts.slice(1).join('/');
    } else if (/^[0-9a-zA-Z_-]{15,}$/.test(link)) {
      appId = link;
    } else {
      const match = link.match(/[?&]appId=([^&]+)/);
      appId = match ? match[1] : '';
    }
    
    if (!appId) {
      throw new Error('无效的小程序ID');
    }
    
    wx.navigateToMiniProgram({
      appId,
      path: path || '',
      envVersion: 'release',
      fail: (err) => handleFail(err, failCallback)
    });
  } catch (err) {
    handleFail(err, failCallback);
  }
}

/**
 * 打开网页视图
 */
function openWebView(url, webViewPath, failCallback) {
  try {
    // 编码URL参数
    const encodedUrl = encodeURIComponent(url);
    wx.navigateTo({
      url: `${webViewPath}?url=${encodedUrl}`,
      fail: (err) => handleFail(err, failCallback)
    });
  } catch (err) {
    handleFail(err, failCallback);
  }
}

/**
 * 打开本地应用 (如WPS, QQ, 百度网盘等)
 */
function openLocalApp(link, failCallback) {
  try {
    // 微信小程序打开本地应用API
    if (wx.openScheme) {
      wx.openScheme({
        scheme: link,
        fail: (err) => handleFail(err, failCallback)
      });
    } 
    // 兼容旧版本API
    else if (wx.navigateToMiniProgram) {
      wx.navigateToMiniProgram({
        appId: '', // 留空表示打开本地应用
        path: '',
        extraData: {
          'scheme': link
        },
        envVersion: 'release',
        fail: (err) => handleFail(err, failCallback)
      });
    } else {
      throw new Error('当前微信版本过低，不支持打开本地应用');
    }
  } catch (err) {
    handleFail(err, failCallback);
  }
}

/**
 * 处理不支持的链接类型
 */
function handleUnsupportedLink(link, failCallback) {
  const err = new Error(`不支持的链接类型: ${link}`);
  console.error(err);
  
  if (typeof failCallback === 'function') {
    failCallback(err);
  } else {
    wx.showToast({
      title: '无法打开该链接',
      icon: 'none'
    });
  }
}

/**
 * 统一处理失败情况
 */
function handleFail(error, callback) {
  console.error('链接跳转失败:', error);
  if (typeof callback === 'function') {
    callback(error);
  } else {
    wx.showToast({
      title: '打开链接失败',
      icon: 'none'
    });
  }
}

// 导出所有函数
module.exports = {
  openLink,
  isLocalMiniprogramLink,
  isOtherMiniprogramLink,
  isWebLink,
  isLocalAppLink,
  openLocalPage,
  openOtherMiniprogram,
  openWebView,
  openLocalApp
};